package com.haoke.buyaction.service.impl;

import com.haoke.buyaction.redisdao.ItemDao;
import com.haoke.buyaction.service.BuyactionService;
import com.haoke.commons.message.HaokeBuyMessage;
import com.haoke.commons.vo.HaokeResult;
import com.haoke.message.publisher.HaokeMessagePublisher;
import com.haoke.pojo.Item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

/**
 * @author yue13
 * 购买商品服务实现
 */
@Service
public class BuyactionServiceImpl implements BuyactionService {

    @Autowired
    private ItemDao itemDao;
    @Autowired
    private HaokeMessagePublisher messagePublisher;

    @Value("${haoke.cache.names.item.prefix}")
    private String itemPrefix;
    @Value("${haoke.cache.names.item.suffix}")
    private String itemSuffix;

    @Value("${haoke.rabbit.buy.exchange}")
    private String exchange;
    @Value("${haoke.rabbit.buy.routingKey}")
    private String routingKey;

    /**
     * 实现流程：
     * 1、 访问redis，查询这个商品是否可购买
     * 2、 封装一个消息对象，发送消息到 MQ，并等待消费者的响应
     * 3、 根据消息消费者响应结果，返回操作结果
     *
     * @param id   商品主键
     * @param user 用户手机号
     * @return
     */
    @Override
    public HaokeResult buyaction(String id, String user) {
        String key = itemPrefix + "::" + itemSuffix + "(" + id + ")";

        Item item = this.itemDao.get(key);
        if (item.getIsRented()) {
            // 房屋已出租。不能再次预定。直接返回。
            HaokeResult haokeResult = HaokeResult.error();
            haokeResult.setMsg("手慢了，已经被抢订，预订失败！");
            return haokeResult;
        }
        //创建消息对象
        HaokeBuyMessage message = new HaokeBuyMessage();
        message.setItemId(id);
        message.setUsername(user);

        //发送消息
        Boolean messageResult =
                (Boolean) messagePublisher.sendMessageSync(exchange, routingKey, message);

        HaokeResult haokeResult;
        if (messageResult) {
            // 购买成功
            haokeResult = HaokeResult.ok();
            haokeResult.setMsg("预定成功！");
        } else {
            // 购买失败
            haokeResult = HaokeResult.error();
            haokeResult.setMsg("手慢了，已经被抢订，预订失败！");
        }
        return haokeResult;
    }
}
